Neste tutorial vamos criar um relatório para mostrar a área colhida de soja em hectares nos municípios brasileiros para o período de 2016-2020.
O objetivo é criar três gráficos: - Série temporal da área colhida de soja do estado. - Gráfico de barras dos 10 municípios com maiores médias de área colhidas (campeões). - Mapa com a área média colhida de soja por município por estado.
Sempre que você for fazer uma análise que vai precisar de diversos pacotes recomendo que você coloque uma seção concentrando o carregamento de todos os pacotes necessários. Isso vai facilitar para reproduzir o seu relatório.
library(tidyverse) # Visualização e manipulação de dados
library(readxl) # Carrega planilha eletrônica
library(geobr) # Mapas do Brasil
library(sf) # Plotar mapas
library(plotly) # Gráficos interativos
Neste exemplo vamos usar um conjunto de dados obtidos do IPEA data
que consta da área de soja colhida por municípios entre os anos de 2016
e 2020. O primeiro passo é carregar a base de dados. Acesse o endereço
conjunto de dados e faça
download do arquivo arecolhida.xls. Recomendo que
salve em seu diretório de trabalho. Assumindo que o conjunto de dados
areacolhida.xls esteja no seu diretório de trabalho o
seguinte código carrega a base de dados e apresenta um resumo do seu
conteúdo.
tb <- readxl::read_excel("areacolhida.xls",
sheet = "Séries")
glimpse(tb)
## Rows: 5,596
## Columns: 8
## $ Sigla <chr> "AC", "AC", "AC", "AC", "AC", "AC", "AC", "AC", "AC", "AC", …
## $ Codigo <chr> "1200013", "1200054", "1200104", "1200138", "1200179", "1200…
## $ Município <chr> "Acrelândia", "Assis Brasil", "Brasiléia", "Bujari", "Capixa…
## $ `2016` <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0…
## $ `2017` <dbl> 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, …
## $ `2018` <dbl> 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0,…
## $ `2019` <dbl> 0, 0, 0, 0, 430, 0, 0, 0, 0, 0, 0, 0, 520, 0, 640, 0, 0, 0, …
## $ `2020` <dbl> 0, 0, 0, 0, 480, 0, 0, 0, 0, 0, 0, 0, 1850, 0, 950, 0, 0, 0,…
Para fazer um gráfico da série temporal de um particular estado
precisamos: - Filtrar as observações do estado de interesse; - Agregar
(somar) os dados de todos os municípios; - Plotar um gráfico de linhas
com o ano no eixo x e área colhida no eixo
y.
Suponha que o estado de interesse seja o Paraná (PR).
estado <- "PR"
# Seleciona dados do estado
UF <- tb %>%
filter(Sigla == estado)
# Empilhando os dados por ano
UF_long <- UF %>%
pivot_longer(cols = c("2016", "2017", "2018", "2019", "2020"),
names_to = "Ano", values_to = "area")
# Agrupando por ano
UF_ano <- UF_long %>%
group_by(Ano) %>%
summarize("area" = sum(area, na.rm = TRUE))
UF_ano$Ano <- as.numeric(UF_ano$Ano)
# Gráfico da série temporal
p1 <- ggplot(UF_ano, aes(x = Ano, y = area)) +
geom_point() +
geom_line() +
xlab("Ano") +
ylab("Área colhida de soja (hectares)")
Você pode facilmente tornar o gráfico interativo usando o pacote
plotly.
ggplotly(p1)
Para fazer esse gráfico precisamos: - Filtrar o estado de interesse; - Calcular a média da área colhida; - Ordenar pela área colhida média; - Pegar os 10 primeiros.
UF_10 <- UF_long %>%
group_by(Município) %>%
summarise("Media" = mean(area)) %>%
slice_max(Media, n = 10)
## Ordenando os níveis para aparecerem na ordem correta
UF_10$Município <- factor(UF_10$Município,
levels = UF_10$Município)
p2 <- ggplot(UF_10, aes(x = Município, y = Media)) +
geom_col() +
coord_flip() +
xlab("Município") +
ylab("Área média colhida de soja (hectares)")
p2
Novamente podemos tornar o gráfico interativo usando o
plotly.
ggplotly(p2)
Para fazer um mapa o primeiro passo é obter os polígonos que
delimitam os municípios. Para isso o R conta com um pacote
chamado de geobr.
cod_uf <- as.numeric(str_sub(UF$Codigo, start = 1, end = 2)[1])
mapa <- geobr::read_municipality(code_muni = cod_uf, year = "2016")
plot(mapa$geom)
Agora que já temos os polígonos precisamos atribuir a eles o valor da
área média colhida de soja. Para isso vamos usar uma operação de
join. Neste caso vamos usar um left_join para
manter apenas os munícipios ou códigos de municípios que aparecem no
mapa.
UF_media <- UF_long %>%
group_by(Município) %>%
summarise("Media" = mean(area), "Codigo" = Codigo[1])
UF_media$Codigo <- as.numeric(UF_media$Codigo)
mapa <- dplyr::left_join(mapa, UF_media, by = c("code_muni" = "Codigo"))
Por fim, podemos plotar o mapa de acordo com o valor da área média colhida de soja em hectares. Note que o valor colhido é muito diferente entre as diferentes áreas. Para facilitar a leitura do gráfico vamos plotar em escala log.
mapa$log_area <- log10(mapa$Media+1)
plot_mapa <- ggplot() +
geom_sf(data=mapa, aes(text = Município, fill=log_area), color= NA, size=.15) +
labs(subtitle="Log da área média colhida de de soja.", size=8) +
scale_fill_distiller(palette = "Blues", name="Log área média colhida de soja")
## Warning: Ignoring unknown aesthetics: text
plot_mapa
Podemos facilmente tornar o mapa reativo usando o pacote
plotly.
ggplotly(plot_mapa)
Podemos ainda trabalhar nas informações que serão mostradas ao passar o mouse.
mapa$info <- paste(mapa$Município, mapa$Media)
plot_mapa <- ggplot() +
geom_sf(data=mapa, aes(text = info, fill=log_area), color= NA, size=.15) +
labs(subtitle="Log da área média colhida de de soja", size=8) +
scale_fill_distiller(palette = "Blues", name="Log área colhida de soja")
## Warning: Ignoring unknown aesthetics: text
ggplotly(plot_mapa)